package DaoImpl;

import java.util.List;

import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Disjunction;
import org.hibernate.criterion.Restrictions;

import Basicas.Apartamento;
import BasicasEnum.SituacaoApartamento;
import BasicasEnum.TipoApartamento;
import Dao.IDAOApartamento;

public class DAOApartamento extends DAOGenerico<Apartamento> implements IDAOApartamento {

	public List<Apartamento> apartamentoListarFindBySituacao(SituacaoApartamento sit){
		
		TypedQuery<Apartamento> tq = getEntityManager().createNamedQuery("ApartamentoFindBySituacao",Apartamento.class);
		tq.setParameter("valor1", sit);
		return tq.getResultList();
	}
	
	public List<Apartamento> apartamentoListarFindByNumero(int num){
		
		TypedQuery<Apartamento> tq = getEntityManager().createNamedQuery("ApartamentoFindByNumero",Apartamento.class);
		tq.setParameter("valor1", num);
		return tq.getResultList();
	}
	
	public List<Apartamento> apartamentoListarFindByTipo(TipoApartamento tipo){
		
		TypedQuery<Apartamento> tq = getEntityManager().createNamedQuery("ApartamentoFindByTipo",Apartamento.class);
		tq.setParameter("valor1", tipo);
		return tq.getResultList();
	}
	
	public List<Apartamento> apartamentoPesquisarPorParametros(List<TipoApartamento> tipos,List<SituacaoApartamento> situacoes ){
		
		CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
		CriteriaQuery<Apartamento> cq = cb.createQuery(Apartamento.class);
		Root<Apartamento> root = cq.from(Apartamento.class);
		cq.select(root);
		
		String sql="Select a FROM Apartamento a where 1=1 ";
		
		for(int i=0;i<tipos.size();i++){
			sql+= " and a.tipoApartamento = :tipo"+i;			
		}
		
		for(int i=0;i<situacoes.size();i++){
			sql+= " and a.situacaoApartamento = :situacao"+i;			
		}		
		System.out.println(sql);
		TypedQuery<Apartamento> tq = getEntityManager().createQuery(sql,Apartamento.class);
		
		for(int i=0;i<tipos.size();i++){
			
			tq.setParameter("tipo"+i, tipos.get(i).toString());			
		}
		
		for(int i=0;i<situacoes.size();i++){
			tq.setParameter("situacao"+i, situacoes.get(i).toString());	
		}
		
		return tq.getResultList();
	}
	
	public List<Apartamento> apartamentoPesquisarPorCriterios(List<TipoApartamento> tipos,List<SituacaoApartamento> situacoes ){
		Session session = (Session) getEntityManager().getDelegate();
		Criteria criteria = session.createCriteria(Apartamento.class);
		
		Disjunction ou = Restrictions.disjunction();
		
		int tamTipo = tipos.size();
		int tamSit  = situacoes.size();
		
		if(tamTipo==0){
			for(SituacaoApartamento situacaoApartamento : situacoes) {
				ou.add(Restrictions.eq("situacaoApartamento",situacaoApartamento));
			}
		}else if(tamSit==0){
			for (TipoApartamento tipoApartamento : tipos) {
				ou.add(Restrictions.eq("tipoApartamento",TipoApartamento.valueOf(tipoApartamento.toString())));
			}
			
		}else{
		for(int i=0; i<tamTipo;i++){
			for(int j=0;j<tamSit;j++){
				ou.add(Restrictions.and(
						Restrictions.eq("tipoApartamento",TipoApartamento.valueOf(tipos.get(i).toString())),
						Restrictions.eq("situacaoApartamento",SituacaoApartamento.valueOf(situacoes.get(j).toString()))		
						
						));
				
			}
			
		}
		}
		criteria.add(ou);
				
		@SuppressWarnings("unchecked")
		List<Apartamento> apt = criteria.list();
		
		return apt;
	}
	

}
